home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 126-150 / disk_138 / modulatools / modulatools.source / menutools.def < prev    next >
Text File  |  1992-05-06  |  11KB  |  191 lines

  1. (******************************************************************************)
  2. (*                                                                            *)
  3. (*    The global constants and variables defined in this module are optional: *)
  4. (* if you don't want to access their features, you needn't import them into   *)
  5. (* your program. The variables in the parameter lists of the procedures are   *)
  6. (* the only variables you are required to supply.                             *)
  7. (*    When describing the order in which certain routines are called, I have  *)
  8. (* adopted the curly-bracket notation of EBNF: routines in curly brackets {}  *)
  9. (* may be called an arbitrary number of times (0 to n). A, {B}, {C, {D}} thus *)
  10. (* implies that A is called once, followed by an arbitrary number of calls to *)
  11. (* to B, followed by an arbitrary number of calls to C. Each of the calls to  *)
  12. (* C may be followed by an arbitrary number of calls to D. Likewise, {{C},{D}}*)
  13. (* implies an arbitrary number of calls to C and D in any order.              *)
  14. (*                                                                            *)
  15. (******************************************************************************)
  16. (*                                                                            *)
  17. (*  Version 1.00a.002 (Beta) :   March 2, 1988                                *)
  18. (*                                                                            *)
  19. (*    These procedures were originally written under version 1.20 of the TDI  *)
  20. (* Modula-2 compiler. I have rewritten this module to operate under the v2.00 *)
  21. (* compiler. However, should you find any problem or inconsistency with the   *)
  22. (* functionality of this code, please contact me at the following address:    *)
  23. (*                                                                            *)
  24. (*                               Jerry Mack                                   *)
  25. (*                               23 Prospect Hill Ave.                        *)
  26. (*                               Waltham, MA   02154                          *)
  27. (*                                                                            *)
  28. (*    Check the module MenuUtils for TDI's (considerably less powerful) ver-  *)
  29. (* sions of my Menu and IntuitionText procedures. The modules GadgetUtils and *)
  30. (* EasyGadgets should also be of great help.                                  *)
  31. (*                                                                            *)
  32. (******************************************************************************)
  33. (*                                                                            *)
  34. (*    The source code to MenuTools is in the public domain. You may do with   *)
  35. (* it as you please.                                                          *)
  36. (*                                                                            *)
  37. (******************************************************************************)
  38.  
  39. DEFINITION MODULE MenuTools;
  40.  
  41. FROM Intuition       IMPORT WindowPtr, MenuPtr, MenuFlags, MenuFlagSet,
  42.                             MenuItemPtr, ItemFlags, ItemFlagSet, 
  43.                             IntuitionTextPtr;
  44. FROM Menus           IMPORT HighComp;
  45. FROM Strings         IMPORT String;
  46.  
  47.  
  48. CONST                  (* set Commandkey to this if you do not want a    *)
  49.    NoKey  = " ";       (* key-equivalent for the current Item or SubItem *)
  50.  
  51.                     (* common assignments for ItemSetting & MenuSetting: *)
  52. CONST
  53.    Checkable = ItemFlagSet{CheckIt, MenuToggle};
  54.    CheckNow  = ItemFlagSet{Checked};              (* requires Checkable  *)
  55.    ItemOn    = ItemFlagSet{ItemEnabled} + HighComp;
  56.    ItemOff   = ItemFlagSet{};
  57.    MenuOn    = MenuFlagSet{MenuEnabled}; (* default value of MenuSetting *)
  58.    MenuOff   = MenuFlagSet{};
  59.  
  60. VAR
  61.    FirstMenu       : MenuPtr;        (* pointer to first Menu in Menu bar *)
  62.    CurrentMenu     : MenuPtr;        (* current Menu    in Menu bar       *)
  63.    CurrentItem     : MenuItemPtr;    (* current Item    in Menu bar       *)
  64.    CurrentSubItem  : MenuItemPtr;    (* current SubItem in Menu bar       *)
  65.    ItemPen         : INTEGER;        (* color of current  Item or SubItem *)
  66.    ItemSelectPen   : INTEGER;        (* color of selected Item or SubItem *)
  67.    LoneMenuStrip   : MenuPtr;        (* unattached, DISPOSEable MenuStrip *)
  68.    SelectText      : String;         (* (Sub)Item text shown if selected  *)
  69.    VerPixPerChar   : CARDINAL;       (* vertical   pixels per character   *)
  70.    HorPixPerChar   : CARDINAL;       (* horizontal pixels per character   *)
  71.    MenuSetting     : MenuFlagSet;    (* characteristics of current Menu   *)
  72.    HiResScreen     : BOOLEAN;        (* high resolution screen?           *)
  73.    AutoIndent      : BOOLEAN;        (* shift (Sub)Items to right?        *)
  74.    RightJustify    : BOOLEAN;        (* extend select boxes to right?     *)
  75.    Left, Top       : INTEGER;        (* left & top location and width &   *)
  76.    Wide, High      : INTEGER;        (* height of current Menu, (Sub)Item *)
  77.    NewItemColumn   : BOOLEAN;        (* flag: start new (Sub)Item column? *)
  78.  
  79.                                     (* all of these parameters are inputs *)
  80.    PROCEDURE InitializeMenuStrip;
  81.  
  82.    PROCEDURE AddMenu    (MenuBarText : String);
  83.  
  84.    PROCEDURE AddItem    (ItemText    : String;
  85.                          Commandkey  : CHAR;
  86.                          ItemSetting : ItemFlagSet;
  87.                          Exclusion   : LONGINT);
  88.  
  89.    PROCEDURE AddSubItem (SubItemText : String;
  90.                          Commandkey  : CHAR;
  91.                          ItemSetting : ItemFlagSet;
  92.                          Exclusion   : LONGINT);
  93.  
  94.    PROCEDURE DestroyMenuStrip (WindowPointer : WindowPtr);
  95.  
  96.  
  97.          (* Variables reset in PROCEDURE InitializeMenuStrip : *)
  98.  
  99.          (* CurrentMenu = NULL    MenuSetting   = MenuON       *)
  100.          (* FirstMenu   = NULL    AutoIndent    = FALSE        *)
  101.          (* SelectText  = NoText  HorPixPerChar = 8            *)
  102.          (* MenuLeft    = 0       VerPixPerChar = 8            *)
  103.          (* HiResScreen = FALSE   RightJustify  = TRUE         *)
  104.  
  105.  (* ItemSetting := Checkable + CheckNow --> this (Sub)Item can be and is  *)
  106.  (* now checked; the routines above automatically set the ItemText flag.  *)
  107.  
  108.  (* Left, Top, Wide & High are recalculated in each subroutine to yield   *)
  109.  (* a pleasing MenuStrip; if you dislike it, you may change them prior to *)
  110.  (* calling AddMenu, AddItem and/or AddSubItem; also, Left & Wide affect  *)
  111.  (* the placement of text in AddMenu but affect the placement and size    *)
  112.  (* of the select boxes in AddItem and AddSubItem;                        *)
  113.  
  114.  (* To what are Left, Top, Wide and High measured relative? For Menus,    *)
  115.  (* they are relative to the upper-left corner of the Screen. For Items,  *)
  116.  (* they are relative to the lower-left corner of the Menu. For SubItems, *)
  117.  (* they are relative to the lower-left corner of the Item.               *) 
  118.  
  119.  (* If AutoIndent = TRUE, all Items under the CurrentMenu (or all SubItems*)
  120.  (* under the CurrentItem) will be shifted to the right to allow for a    *)
  121.  (* checkmark. If AutoIndent = FALSE, then only those (Sub)Items which    *)
  122.  (* request a checkmark in ItemSetting will be shifted to the right. The  *)
  123.  (* amount of space added to the left of the select box depends upon the  *)
  124.  (* value of HiresScreen.                                                 *)
  125.  
  126.  (* If RightJustify is TRUE, then the right edge of each Item extends to  *)
  127.  (* the edge of its Menu. Otherwise, the right edge of each Item is deter-*)
  128.  (* mined by the width of the longest Item in the current Item-column.    *)
  129.  (* This is of most use when multiple Item-columns are desired: setting   *)
  130.  (* RightJustify to TRUE ensures that the first column of Items isn't ex- *)
  131.  (* cessively wide.                                                       *)
  132.  
  133.  (* If CommandKey <> NoKey, then space will be added to the right of the  *)
  134.  (* (Sub)Item's select box according to the value of HiresScreen.         *)
  135.  
  136.  (* In addition, TextFlag is included in all Itemsetting values above,    *)
  137.  (* since these routines are designed to create text Menus and (Sub)Items.*)
  138.  
  139.  (* HorPixPerChar and VerPixPerChar are used to determine the width and   *)
  140.  (* height of the Menus, Items and SubItems. You may change these values  *)
  141.  (* to quickly obtain larger select boxes.                                *)
  142.  
  143.  (* SelectText allows you to specify a different text be displayed when   *)
  144.  (* the (Sub)Item is chosen, though it prevents use of other highlighting.*)
  145.  (* SelectText = NoText upon exit from each of the above four procedures. *)
  146.  (* As stated above, Left, Wide, Top and High are reset or recalculated   *)
  147.  (* prior to exit from the above four routines. Don't change these values *)
  148.  (* unless you know where you want a specific Menu or (Sub)Item placed.   *)
  149.   
  150.  (* CurrentMenu, CurrentItem and CurrentSubItem point to the Menu, Item   *)
  151.  (* or SubItem, respectively, which was just added to the MenuStrip. Thus,*)
  152.  (* if you require access to a particular node in the MenuStrip, you may  *)
  153.  (* copy these pointers as needed following the call to AddMenu, AddItem  *)
  154.  (* or AddSubItem.                                                        *)
  155.  
  156.  (* DestroyMenuStrip is designed to remove a MenuStrip from a Window and  *)
  157.  (* DISPOSE of its Menus, Items and SubItems, as well as the IntuitionText*)
  158.  (* structures to which they point. ANY non-NULL pointer in the MenuStrip *)
  159.  (* has its contents DISPOSED. If you wish only to DISPOSE of a MenuStrip *)
  160.  (* (one that is not attached to a Window), then set WindowPointer to NULL*)
  161.  (* and assign LoneMenuStrip to the MenuStrip of which to DISPOSE. Just   *)
  162.  (* prior to exit, DestroyMenuStrip calls InitializeMenuStrip. Thus, you  *)
  163.  (* need only call InitializeMenuStrip for the first MenuStrip and if you *)
  164.  (* want multiple MenuStrips defined at one time. I didn't call the pro-  *)
  165.  (* cedure in the module body because it looked unusual to call it for the*)
  166.  (* second and subsequent concurrent MenuStrips but not the first.        *)
  167.  
  168.  (* You can easily create multiple MenuStrips by calling InitializeMenu-  *)
  169.  (* Strip once for each MenuStrip. Be sure to save the value of FirstMenu *)
  170.  (* prior to the call, as that is the pointer to the first Menu of the    *)
  171.  (* current MenuStrip.                                                    *)
  172.  
  173.  (* Since the IntuiText routines above are used to create the Intuition-  *)
  174.  (* Text structures for the MenuStrip, you may change the values of the   *)
  175.  (* global variables associated with those routines to obtain different   *)
  176.  (* text attributes (color, font, etc.) for your MenuStrip.               *)
  177.  
  178.  (* The colors of Items and SubItems can be changed by varying ItemPen and*)
  179.  (* ItemSelectPen. ItemPen assigns the foreground color of the (Sub)Item  *)
  180.  (* as it normally appears; ItemSelectPen assigns the foreground color it *)
  181.  (* assumes when selected.                                                *)
  182.   
  183.  (* Be sure to add at least one Item to each Menu to prevent a crash.     *)
  184.  
  185.  (* In case you haven't figured it out, the order in which you call these *)
  186.  (* routines is as follows:  InitializeMenuStrip, {AddMenu,  AddItem,     *)
  187.  (* {AddSubItem}, {AddItem, {AddSubItem}}}, DestroyMenuStrip.             *)
  188.  
  189.  
  190. END MenuTools.
  191.